[レポート]Deep Composer入門してみた #reinvent #AIM223
Midnight Madnessでのre:Invent2019一発目の発表、AWS Deep Composerのハンズオンセッションを受けた時のまとめです。
Deep Composer
AWS DeepComposerは、機械学習スキルを伸ばすために設計された音楽キーボードと最新の機械学習技術を使用して、実践的に学習することを目的とした開発者向けのサービスです。
AWSは機械学習に対するミッションに”全てのエンジニアにとって機械学習を身近なものにする”と掲げています。Deep Composerの目的は開発者が実際に触りながらGenerative AIのコンセプトを学ぶことにあります。Generative AIの作りを意識しながらDeep Composer利用することで、このテクノロジーをどのように応用できるかということを具体的にイメージしやすくなります。
Deep Composer(ハードウェア)
Deep Composerを使うのに特化したキーボードで、 キー数は32、左からピッチ、モデレート、ボリュームコントロール、他にも複数のボタンが搭載されており、Amazon.comで価格$99で販売される予定だそうです。(時期未定)
このキーボードインプットを元にAIがコンポジションやハーモニーを生成します。開発者は既存のモデルを利用するか、独自の機械学習モデルを作成しより良い音楽を生成するようにモデルを調整します。モデルの作成、強化学習にはSagemakerを利用します。
今回のセッションではこちらのマテリアルに沿って実際にDeep Composerのキーボードと用意されたモデルを使って音楽をアレンジしました。
Generative AI
Generative Adversarial Network(GAN)は「Generator」、「Discriminator」 と呼ばれる2つのネットワークを利用します。 Generatorが音楽を生成し、Discriminatorが生成された音楽を評価します。モデルの学習プロセスで生成と評価を繰り返し行い品質を向上させます。
Midnight Madnessでの発表では「Generator」はオーケストラ、「Discriminator」は指揮者、と比喩されていました。
Deep Composerの仕組み
Deep Composer キーボード
Deep ComposerキーボードをPCに接続しメロディの入力を行います。キーボードからはボリューム、プレイバック、レコードのフローなどの設定を行うことができます。
Deep Composerコンソール
コンソールからあらかじめトレーニングされたロック、ポップ、ジャズ、クラシックなどのモデルを試すことができました。独自のカスタムモデルを作成し利用することも可能です。
作成した音楽を公開する
作成した音楽はDeep ComposerコンソールからワンクリックでSound Cloudへ公開することができます。
Generative AIモデルについて
モデルの作成、学習にはAmazon Sagemakerを利用します。
やってみた
こちらのマテリアルにそってハンズオンを行いました。
このハンズオンではDeep Composerが利用できる仮アカウントと学習済みモデルのJupyter Notebookが共有されました。以下はハンズオン時の手順を示しています。残念ながらDeep ComposerはまだPreview段階ですぐに試すことはできない状態ですが、少しでも現地での体験とDeepComposerがどんなものなのかが伝わればと思います。
ハンズオン前準備
- Deep ComposerキーボードをPCに接続します。
-
まだ一般公開されていないのでDeep Composer 用の仮アカウントが配布されました。ハンズオンではこの仮アカウントでログインして
https://console.aws.amazon.com/deepcomposer
のパスへアクセスしました。 -
Jupyter Notebookの手順に沿ってモデルを作成します。
Step1 インプット
Get StartedボタンからDeep Composer Studioを開き、早速キーボードからメロディをインプットします。録音はコンソールのボタンからスタート/ストップします。
録音が終わったらプレイボタンで再生して正しく録音されていることを確認しましょう。
Step2 音楽を作成
録音できていることが確認できたら既存のトレーニング済みモデルを選択してGenerate Composition
からアレンジを作成します。たったこれだけで機械学習がアレンジを作成してくれます。
独自モデルについて
ではトレーニング済の既存の機械学習モデルではなく独自のモデルを利用する場合はどうでしょう。 配布された資料に詳しい説明が記載されていたのでまとめてみました。ハンズオンでは音楽をバッハ風にアレンジするモデルを作成しました。
GANで音楽生成
Generative Adversarial Network(GAN)を使った具体的な学習フローは、Generatorがコンポジションを作成し、Discriminatorが生成された音楽と、バッハの音楽を比較しフィードバックをするプロセスを繰り返します。
機械学習にはTensorFlow、サンプルプロジェクトではデータセットにJSB-Chorales-datasetを使いました。JSB-Chorales-datasetにはメインボーカルと三種の低音で構成されるシンプルなメロディの賛美歌のスニペットが229含まれます。このデータセットをPiano Rollフォーマットで使用しました。
データの形式
Piano Roll は機械学習アルゴリズムが理解できる音楽の表現方法です。水平軸に「時間」、垂直軸に「ピッチ」を持つ2次元のグリッドとして表示します。
データセットを作成
numpy配列のデータを元にTensorflowデータセットオブジェクトを作成します。
numpy配列からTensorflowデータセットオブジェクトを作成して、モデルに渡します。 データセットオブジェクトは一定量のデータをモデルに渡すのに役立ちます。バッチは重みが更新される前に深層学習ネットワークを通過するデータのサブセットです。トレーニング環境ではデータセット全体を一度にメモリにロードできない場合があるため、ほとんどのトレーニングシナリオではデータのバッチ処理が必要です。
モデルの設計
前述した通りGANモデルは”Generator”と”Discriminator(Critic)”と呼ばれる二つのネットワークから成り立ち、細やかにループを繰り返し学習を行います。ここではDeep Composerにおける二つのネットワークのそれぞれの役割についてざっくりと説明します。
Generator
1.Generatorは、入力としてシングルトラックピアノロール(メロディ)のバッチを取り込み、入力音楽トラックのそれぞれに伴奏を追加することにより、出力としてマルチトラックピアノロールのバッチを生成します。
2.Discriminatorは生成された音楽トラックを取得し、トレーニングデータセットに存在する実データから生成された音楽がどれだけ逸脱しているかを予測します。
3.このDiscriminatorからのフィードバックは、Generatorの重みを更新するために使用されます。
Discriminator(Critic)
GeneratorがDiscriminatorからのフィードバックを得て音楽伴奏を作成するのが上手くなると、Discriminatorも再訓練する必要があります。Generatorによって生成された音楽トラックを偽の入力として、オリジナルのデータセットからの等価な数の曲を実際の入力としてDiscriminatorを訓練します。モデルが収束してリアルな音楽を生成するまでこのプロセスを交互に繰り返します
Wasserstein GAN(WGAN)
DeepComposerのモデルの学習にはWasserstein損失関数を使用します。GANの拡張であるWasserstein Generative Adversarial Network(WGAN)を使用することでモデルのトレーニング時の安定性を向上させ、生成された音楽の品質と相関する損失関数を提供します。ハンズオンではGeneratorとDiscriminatorそれぞれに特殊な損失関数を利用しました。
Generator Loss
Generatorは、生成されたピアノロールをできるだけ実際のピアノロールに近づけるように訓練されています。GeneratorにはDiscriminator損失関数の負のWasserstein(Generator)損失関数を使用します。
Discriminator Loss
Discriminatorの損失関数はまず、リアルピアノロール分布と生成された(本物ではない)ピアノロール分布の間の距離を最大化するように設計されたWasserstein(Critic)損失関数から始めます。
これに入力に対するDiscriminatorの勾配の振る舞いを制御するために設計された勾配ペナルティ損失関数項を追加します。こうすることでジェネレーターの最適化が容易になります。
学習中
Wasserstein損失関数を使用する場合、Generator更新の勾配が正確であることを保証するために、Discriminatorを収束するようにトレーニングする必要があります。これは、標準的なGANとは対照的です。標準のGANでは、Discriminatorが強くなりすぎないようにして、勾配が消えないようにすることが重要です。
したがって、Wasserstein損失関数を使用すると、GANをトレーニングする際の重要な問題の1つである識別器とジェネレーターのトレーニングのバランスをとる方法がなくなります。 WGANを使用するとGeneratorの更新の間にDiscriminatorを数回トレーニングするだけで、収束に近づくことができます。使用される一般的な比率は、1つのジェネレーター更新に対して5つのDiscriminator更新です。
学習プロセスを見守る
モデルのトレーニングは時間とリソースを多く消費するため、異常が発生した場合にそれを察知して対処するには、トレーニングを継続的に監視する必要があります。ここに注目すべきいくつかのポイントがあります。
正しく学習しているかを見極める
敵対的学習プロセスは非常に動的であり、高周波振動は非常に一般的ですが損失(DiscriminatorまたはGenerator)が巨大な値に急上昇するか、0に急落するか、単一の値にとどまる場合、どこかに問題がある可能性があります。
該当する場合、Discriminatorの損失およびその他の音楽品質の指標を監視します。それらは予想された軌跡に沿っていますか?生成されたサンプル(ピアノロール)は時間とともに改善されていますか?モード崩壊の証拠がありますか?サンプルを実際に聞いてみることも学習が進んでいるかどうかを確認する方法の一つです。
学習はいつ終わるのか
学習の終わりを見極めるポイントがいくつかあります。
- 生成された音楽のクオリティが十分なものに達した時
- Discriminatorの損失に改善がみられない時
- 音楽品質メトリックの期待値がトレーニングデータの同じメトリックの対応する期待値に収束した時
学習途中のサンプルを評価する
通常、あらゆる種類のニューラルネットワークをトレーニングする場合、トレーニングの期間全体にわたって損失関数の値を監視するのが一般的な方法です。 WGANのDiscriminatorの損失は、サンプルの品質とよく相関することがわかっています。分類子や回帰分析のような伝統的なモデルの精度を評価する標準的なメカニズムは存在しますが、生成モデルの評価は未だに活発に研究が行われている分野です。音楽生成の領域では特にこの問題は顕著で、一般的と言える評価方法が存在しません。これに対処するために、データの高レベルの測定を行い、モデルがそれらの測定と一致する音楽をどれだけうまく生成しているかを示します。モデルがトレーニングデータセットのこれらの測定値の平均値に近い音楽を生成する場合、音楽は一般的な「形状」に一致する必要があります。
ここでは三つの測定値に注目します。
- 空のバーの割合:空のバーが全体の何パーセントを占めるかを観察する
- ピッチヒストグラム:ピッチの分布と位置のメトリクス
- スケールの割合:音の合計数に対する、音楽で見られる共通のキーであるCメジャーキーの音の数の比率
学習結果
学習が終了したら以下の方法でモデルを評価します。
- トレーニング中にGeneratorとDiscriminatorの損失がどのように変化したかを調べる
- トレーニング中に特定の音楽指標がどのように変化したかを理解する
- イテレーションごとに同じ入力に対して生成されたピアノロール出力を視覚化し、ビデオを作成する
所感
カスタムモデルを作成するところから複雑になるので、ざっくりとGANの概要と全体の学習の流れを理解してから触り始めるのがいいかと思います。今はまだPreviewですがGAの段階ではもっと多様なアレンジのモデルが公開されると思いますし、ピアノだけでなくいろんな楽器でアレンジが作れるようになるかもしれないと思うととても期待できるサービスだと思いました。一足早く試したい方はこちらからPreview Programに申し込んでみてはいかがでしょうか。